<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<p>abcdef</p>
<script>
test(() => {
  let selection = getSelection();
  selection.removeAllRanges();
  let range = document.createRange();
  let text = document.querySelector('p').firstChild;
  range.setStart(text, 1);
  range.setEnd(text, 2);

  selection.addRange(range);
  assert_equals(selection.anchorNode, text);
  assert_equals(selection.anchorOffset, 1);
  assert_equals(selection.focusNode, text);
  assert_equals(selection.focusOffset, 2);

  range.setStart(text, 0);
  assert_equals(selection.anchorOffset, 0);
}, 'Mutation of Range after adding it to Selection should update Selection attributes.');

test(() => {
  let selection = getSelection();
  selection.removeAllRanges();
  let range = document.createRange();
  let text = document.querySelector('p').firstChild;
  range.setStart(text, 1);
  range.setEnd(text, 2);

  selection.addRange(range);
  assert_equals(selection.anchorNode, text);
  assert_equals(selection.anchorOffset, 1);
  assert_equals(selection.focusNode, text);
  assert_equals(selection.focusOffset, 2);

  text.parentNode.contentEditable = true;
  range.setStart(text, 0);
  assert_equals(selection.anchorOffset, 0);
  assert_not_equals(document.activeElement, text.parentNode);
}, 'Mutation of Range after adding it to Selection should not focus on editable anchor.');

test(() => {
  let selection = getSelection();
  selection.removeAllRanges();
  let range = document.createRange();
  range.selectNode(document.body);
  selection.addRange(range);
  assert_equals(selection.rangeCount, 1);

  let document2 = document.implementation.createHTMLDocument();
  document2.innerHTML = '<html><body>abc</body></html>';
  range.selectNode(document2.body);
  // TODO(tkent): The specification says nothing about such case. For now, we
  // unregister the Range from the Selection for ease of implementation
  // though Firefox and Edge keep |selection.getRangeAt(0) == range|.
  assert_equals(selection.rangeCount, 0);
}, 'Switching Range document should clear registered Selection.');

test(() => {
  let selection = getSelection();
  selection.removeAllRanges();
  let range = document.createRange();
  range.selectNode(document.body);
  selection.addRange(range);
  assert_equals(selection.rangeCount, 1);

  let span = document.createElement('span');
  span.innerHTML = 'text';
  range.selectNode(span.firstChild);
  // TODO(tkent): The specification says nothing about such case. For now, we
  // unregister the Range from the Selection for ease of implementation
  // though Firefox and Edge keep |selection.getRangeAt(0) == range|.
  assert_equals(selection.rangeCount, 0);
}, 'Updating Range for another root should clear registered Selection.');
</script>
